def
vs async def
正是製做Tool前先來了解一下常見的兩個函數定義方法,分別是 def
和 async def
,這兩個到底哪裡不一樣呢?
def
(同步)def
關鍵字用於定義一個常規函式,當呼叫常規函式時,程式的執行會被阻塞,直到函式返回。
import time
def say_hello(name: str):
print(f"準備向 {name} 問好...")
time.sleep(2) # 模擬一個阻塞的 I/O 操作
print(f"你好, {name}!")
say_hello("世界")
say_hello("使用者")
say_hello("世界")
。say_hello("使用者")
。總執行時間約為 4 秒。
async def
(非同步)async def
關鍵字用於定義一個協程,這是一種可以暫停和恢復的特殊函式。
協程用於非同步程式設計,允許程式在等待操作完成時執行其他任務。
import asyncio
async def say_hello(name: str):
print(f"準備向 {name} 問好...")
await asyncio.sleep(2) # 非阻塞的睡眠
print(f"你好, {name}!")
async def main():
await asyncio.gather(
say_hello("世界"),
say_hello("使用者")
)
asyncio.run(main())
asyncio.run(main())
啟動事件循環。main()
呼叫 asyncio.gather()
並傳入兩個 say_hello
協程。say_hello("世界")
。await asyncio.sleep(2)
暫停協程,並允許事件循環執行其他任務。say_hello("使用者")
。await asyncio.sleep(2)
也暫停這個協程。asyncio.sleep()
呼叫完成。say_hello
協程恢復並輸出「你好, 世界!」。say_hello
協程恢復並輸出「你好, 使用者!」。總執行時間約為 2 秒,因為兩個 say_hello
協程是並發執行的。
功能 | def |
async def |
---|---|---|
類型 | 常規函式 | 協程 |
執行 | 同步 | 非同步 |
阻塞 | 是 | 否 (與 await 一起使用時) |
使用場景 | 通用函式 | I/O 密集型和高階結構化網路程式碼 |